import axios, { type CreateAxiosDefaults } from 'axios'
import { redirect } from 'next/navigation'
import { toast } from 'sonner'

import { AUTH_PAGES } from '@/config/pages-url.config'

import {
	getAccessToken,
	removeTokenStorage
} from '@/services/auth-storage.service'

const options: CreateAxiosDefaults = {
	baseURL: process.env.NEXT_PUBLIC_API_URL,
	headers: {
		'Content-Type': 'application/json'
	},
	withCredentials: true
}

const axiosDefaults = axios.create(options)

const axiosWithAuth = axios.create(options)
axiosWithAuth.interceptors.request.use(config => {
	const accessToken = getAccessToken()

	if (config?.headers && accessToken)
		config.headers.Authorization = `Bearer ${accessToken}`

	return config
})

axiosWithAuth.interceptors.response.use(
	config => config,
	error => {
		const originalRequest = error.config

		if (error?.response?.status === 401 && !originalRequest._isRetry) {
			originalRequest._isRetry = true
			removeTokenStorage()
			redirect(AUTH_PAGES.LOGIN)
		}

		// Обработка ошибок
		if (error.response) {
			if (error.response.data.detail)
				// Ошибка с полем detail
				toast.error(`Сервер вернул ошибку`, {
					description: error.response.data.detail
				})
			// Ошибки валидации
			else
				toast.error('Данные не соответствуют требованиям сервера', {
					description: Object.entries(error.response.data)
						.map(([key, value]) => `${key}: ${value}`)
						.join('\n')
				})
		}
		// Общая ошибка
		else
			toast.error(`Сервер вернул ошибку`, {
				description: error.message
			})

		throw error
	}
)

export { axiosDefaults, axiosWithAuth }
